home *** CD-ROM | disk | FTP | other *** search
/ The World of Computer Software / The World of Computer Software.iso / newmarch.zip / CALENDAR.C < prev    next >
C/C++ Source or Header  |  1992-09-08  |  19KB  |  711 lines

  1. /* Author:   $Author: jan $
  2.  * File:     $Source: /usr/usrs/jan/desktop/X_Book.boo/programs/RCS/calendar.c,v $
  3.  * Date:     $Date: 1992/09/09 00:09:47 $
  4.  * Revision: $Revision: 1.1 $
  5.  */
  6.  
  7. #include "copyright.h"
  8.  
  9. /*-----------------------------------------------------
  10. **    Include Files
  11. */
  12. #include <stdio.h>
  13. #include <string.h>
  14. #include <sys/types.h>
  15. #include <Xm/BulletinB.h>
  16. #include <Xm/CascadeB.h>
  17. #include <Xm/DialogS.h>
  18. #include <Xm/Form.h>
  19. #include <Xm/Label.h>
  20. #include <Xm/MainW.h>
  21. #include <Xm/MessageB.h>
  22. #include <Xm/PushB.h>
  23. #include <Xm/RowColumn.h>
  24. #include <Xm/ScrolledW.h>
  25. #include <Xm/Text.h>
  26. #include <Xm/SelectioB.h>
  27.  
  28. /* Motif version number */
  29. #if XmVersion == 1000
  30. #define MOTIF_1_0
  31. #endif
  32.  
  33. /*-----------------------------------------------------
  34. **    Forward Declarations
  35. */
  36. void main ();
  37. void CreateApplication ();
  38. Widget CreateHelp ();
  39. Widget CreateMenu();
  40. Widget CreateCalendar();
  41. Widget CreatePopupEditor();
  42. char *ReadFile ();
  43.  
  44. /* Close popup help callback */
  45. void CloseCB ();
  46.  
  47. /* Help callbacks */
  48. void AboutHelpCB ();
  49. void ApplicHelpCB ();
  50. void EditHelpCB ();
  51.  
  52. /* Editor callbacks */
  53. void EditDayCB ();
  54. void EditCancelCB();
  55. void EditExitCB ();
  56. void EditSaveCB ();
  57. void EditChangedCB ();
  58.  
  59. /* Exiting application with 
  60.    unsaved files callbacks
  61. */
  62. void ExitSaveCB();
  63. void ExitDontSaveCB();
  64. void ExitAnywayCB();
  65. void QuitCB ();
  66.  
  67. /* File menu callbacks */
  68. void FileSaveCB ();
  69. void FileExitCB ();
  70.  
  71. /*-----------------------------------------------------
  72. **    Global Variables
  73. */
  74. #define MAX_ARGS 20
  75. #define Class_name "XmCalendar"
  76.  
  77. Arg     args[MAX_ARGS];
  78. Widget  popups[29];
  79. char    *text[29];
  80. Bool    text_saved[29];
  81. char * daylabels[] = {"Mon", "Tue", "Wed", "Thu", "Fri",
  82.                       "Sat", "Sun"};
  83.  
  84. /* Help texts */
  85. char APPLIC_HELP_TEXT[] =
  86. "Click on a day to see or \n\
  87. edit messages for that day";
  88. char ABOUT_HELP_TEXT[] =
  89. "XmCalendar - version 1.0 \n\
  90. J.D. Newmarch";
  91. char EDIT_HELP_TEXT[] =
  92. "A simple editor";
  93.  
  94. /*-----------------------------------------------------
  95. **    main        - main logic for application
  96. */
  97. void main (argc,argv)
  98.     unsigned int    argc;
  99.     char     **argv;
  100. {
  101.     Display    *display;    /*  Display        */
  102.     Widget    app_shell;    /*  ApplicationShell    */     
  103.     app_shell = XtInitialize(NULL,
  104.                Class_name,     /* class name */
  105.                NULL,         /* options */
  106.                0,        /* number of options */
  107.                &argc, argv); 
  108.  
  109.     /*    Create and realize main application window.
  110.     */
  111.     CreateApplication (app_shell);
  112.     XtRealizeWidget (app_shell);
  113.  
  114.     /*    Get and dispatch events.
  115.     */
  116.     XtMainLoop ();
  117. }
  118.  
  119. /*-----------------------------------------------------
  120. **    CreateApplication    - create main window
  121. */
  122. void CreateApplication (parent)
  123.     Widget    parent;
  124. {
  125.     Widget    main_window;
  126.     Widget    menu;
  127.     Widget    calendar;
  128.     register int    n;
  129.     XmString    label_string;
  130.  
  131.     /*    Create MainWindow
  132.     */
  133.      n = 0;
  134.     main_window = XmCreateMainWindow (parent, "main1",
  135.                           args, n);
  136.     XtManageChild (main_window);
  137.     menu = CreateMenu(main_window);
  138.     calendar = CreateCalendar(main_window);
  139.  
  140.     XmMainWindowSetAreas (main_window,
  141.             menu,         /* menu bar */
  142.             NULL,         /* command */
  143.             NULL,        /* horizon scroll bar */
  144.             NULL,        /* vert scroll bar */
  145.             calendar);    /* work area */
  146. }
  147. Widget CreateMenu(parent)
  148.     Widget parent;
  149. {
  150.     Widget        menu_bar;
  151.     Widget        menu_pane;
  152.     Widget        cascade;
  153.     Widget        button;
  154.     int n;    /*    Create MenuBar in MainWindow.
  155.     */
  156.     n = 0;
  157.     menu_bar = XmCreateMenuBar (parent, "menu_bar",
  158.                                 args, n);
  159.     XtManageChild (menu_bar);
  160.  
  161.     /*    Create "File" PulldownMenu.
  162.     */
  163.     n = 0;
  164.     menu_pane = XmCreatePulldownMenu (menu_bar,
  165.                         "menu_pane", args, n);
  166.  
  167.     n = 0;
  168.     button = XmCreatePushButton (menu_pane, "Save",
  169.                          args, n);
  170.     XtManageChild (button);
  171.     XtAddCallback (button, XmNactivateCallback,
  172.                          FileSaveCB, NULL); 
  173.  
  174.     n = 0;
  175.     button = XmCreatePushButton (menu_pane, "Exit",
  176.                          args, n);
  177.     XtManageChild (button);
  178.     XtAddCallback (button, XmNactivateCallback,
  179.                           FileExitCB, (caddr_t) 1);
  180.  
  181.     n = 0;
  182.     XtSetArg (args[n], XmNsubMenuId, menu_pane);  n++;
  183.     cascade = XmCreateCascadeButton (menu_bar, "File",
  184.                           args, n);
  185.     XtManageChild (cascade);
  186.  
  187.     /*    Create "Help" PulldownMenu
  188.     */
  189.     n = 0;
  190.     menu_pane = XmCreatePulldownMenu (menu_bar,
  191.                           "menu_pane", args, n);
  192.  
  193.     n = 0;
  194.     button = XmCreatePushButton (menu_pane, "About",
  195.                           args, n);
  196.     XtManageChild (button);
  197.     XtAddCallback (button, XmNactivateCallback,
  198.                            AboutHelpCB, NULL); 
  199.  
  200.     n = 0;
  201.     button = XmCreatePushButton (menu_pane,
  202.                            "Application", args, n);
  203.     XtManageChild (button);
  204.     XtAddCallback (button, XmNactivateCallback,
  205.                           ApplicHelpCB, NULL);
  206.  
  207.     n = 0;
  208.     XtSetArg (args[n], XmNsubMenuId, menu_pane);  n++;
  209.     cascade = XmCreateCascadeButton (menu_bar, "Help",
  210.                           args, n);
  211.     XtManageChild (cascade);
  212.  
  213.     n = 0;
  214.     XtSetArg (args[n], XmNmenuHelpWidget,
  215.                            cascade);  n++;
  216.     XtSetValues (menu_bar, args, n);
  217.     return (menu_bar);
  218. }
  219.  
  220. Widget
  221. CreateCalendar(parent)
  222.     Widget parent;
  223. {   Widget rowcol;
  224.     Widget label;
  225.     Widget button;
  226.     int day, n;
  227.     char daystr[4];
  228.  
  229.     n = 0;
  230.     XtSetArg (args[n], XmNpacking, XmPACK_COLUMN); n++;
  231.     XtSetArg (args[n], XmNorientation,
  232.                        XmHORIZONTAL); n++;
  233.     XtSetArg (args[n], XmNnumColumns, 5); n++;
  234.     rowcol = XmCreateRowColumn(parent, "row col",
  235.                                args, n);
  236.     XtManageChild (rowcol);
  237.  
  238.     for (day = 0; day < 7; day++)
  239.     {
  240.         n = 0;
  241.         label = XmCreateLabel (rowcol, daylabels[day],
  242.                                args, n);
  243.         XtManageChild (label);
  244.     }
  245.  
  246.     for (day = 1; day <= 28; day++)
  247.     {        popups[day] = CreatePopupEditor (rowcol,
  248.                                               day);
  249.         text_saved[day] = True;
  250.         sprintf (daystr, "%d", day);
  251.         n = 0;
  252.         XtSetArg (args[n], XmNlabelString, NULL);
  253.         button = XmCreatePushButton (rowcol, daystr,
  254.                                      args, n);
  255.         XtAddCallback(button, XmNactivateCallback,
  256.                       EditDayCB, popups[day]);
  257.         XtManageChild (button);
  258.     }
  259.     return (rowcol);
  260. }
  261.  
  262.  
  263. /*---------------------------------------------------
  264. **    CreateHelp        - create help window
  265. */
  266. Widget CreateHelp (parent, help_text, title_text)
  267.     Widget        parent;
  268.     char          *help_text;
  269.     char          *title_text;
  270. {
  271.     Widget        button;
  272.     Widget        message_box;
  273.     Arg        args[MAX_ARGS];
  274.     register int    n;
  275.     XmString    title_string = NULL;
  276.     XmString    message_string = NULL;
  277.     XmString    button_string = NULL;
  278.  
  279.     /*    Generate message to display.
  280.     */
  281.     message_string = XmStringCreateLtoR (help_text,
  282.                              XmSTRING_DEFAULT_CHARSET);
  283.     button_string = XmStringCreateLtoR ("Close",
  284.                              XmSTRING_DEFAULT_CHARSET);
  285.     title_string = XmStringCreateLtoR (title_text,
  286.                              XmSTRING_DEFAULT_CHARSET); 
  287.  
  288.    /*    Create MessageBox dialog.
  289.     */
  290.     n = 0;
  291.     XtSetArg (args[n], XmNdialogTitle,
  292.                              title_string);  n++;
  293.     XtSetArg (args[n], XmNokLabelString,
  294.                              button_string);  n++;
  295.     XtSetArg (args[n], XmNmessageString,
  296.                              message_string);  n++;
  297.     message_box = XmCreateMessageDialog (parent, 
  298.                             "helpbox", args, n);
  299.     XtAddCallback (message_box, XmNokCallback, CloseCB, NULL);
  300.  
  301.     button = XmMessageBoxGetChild (message_box,
  302.                              XmDIALOG_CANCEL_BUTTON);
  303.     XtUnmanageChild (button);
  304.     button = XmMessageBoxGetChild (message_box,
  305.                             XmDIALOG_HELP_BUTTON);
  306.     XtUnmanageChild (button);
  307.  
  308.     /*    Free strings and return MessageBox.
  309.     */
  310.     XmStringFree (title_string);
  311.     XmStringFree (message_string);
  312.     XmStringFree (button_string);
  313.     return (message_box);
  314. }
  315.  
  316. /*----------------------------------------------------
  317. **    CloseCB            - callback for close button
  318. */
  319. void 
  320. CloseCB  (w, client_data, call_data)
  321.     Widget    w;    /*  widget id        */
  322.     caddr_t    client_data;    /*  font pointer    */
  323.     caddr_t    call_data;    /*  data from widget class  */
  324. {   /*    Unmanage widgets.
  325.     */
  326.     XtUnmanageChild (w);
  327.     XtDestroyWidget (XtParent (w));
  328. }
  329.  
  330. #ifdef MOTIF_1_0
  331. /* to fix a "feature" of a bulletin board in a dialog */
  332. char transLine[] = "<Key>Return: newline()";
  333. #endif
  334.  
  335. Widget
  336. CreatePopupEditor (parent, day)
  337.     Widget    parent;
  338.     int    day;
  339. {
  340.     Widget    edit_message_box;
  341.     Widget    edit_dialog;
  342.     Widget    edit_text;
  343.     int    n;
  344. #ifdef MOTIF_1_0
  345.     XtTranslations    transTable;
  346. #endif
  347.     char daystr[4];
  348.     sprintf (daystr, "%d", day);
  349.     /* create the display window with a text widget as
  350.     ** a popup window
  351.     */
  352.     n = 0;
  353.     XtSetArg (args[n], XmNselectionLabelString,
  354.                            XmStringCreateLtoR ("",
  355.                              XmSTRING_DEFAULT_CHARSET));
  356.     n++;
  357.     XtSetArg(args[n], XmNautoUnmanage, False); n++;
  358.     edit_dialog = XmCreatePromptDialog(parent,
  359.                 daystr, args, n);
  360.     XtUnmanageChild (XmSelectionBoxGetChild (
  361.                                      edit_dialog,
  362.                                XmDIALOG_TEXT));
  363.     XtManageChild (XmSelectionBoxGetChild (edit_dialog,
  364.                                XmDIALOG_APPLY_BUTTON));
  365.     /* Add callbacks for each button.
  366.        The day value is passed in as client data.
  367.        Note the type cast of int to pointer for this
  368.     */
  369.     XtAddCallback(edit_dialog, XmNapplyCallback,
  370.                   EditSaveCB, (caddr_t) day);
  371.     XtAddCallback(edit_dialog, XmNcancelCallback,
  372.                   EditCancelCB, (caddr_t) day);
  373.     XtAddCallback(edit_dialog, XmNhelpCallback,
  374.                   EditHelpCB, (caddr_t) day);
  375.     XtAddCallback(edit_dialog, XmNokCallback,
  376.                   EditExitCB, (caddr_t) day);
  377.  
  378.     n = 0;
  379.     XtSetArg (args[n], XmNtitle, daystr); n++;
  380.     XtSetValues (XtParent(edit_dialog), args, n);
  381.  
  382.     n = 0;
  383.    XtSetArg(args[n], XmNeditMode,
  384.                                XmMULTI_LINE_EDIT); n++;
  385.     edit_text = XmCreateScrolledText(edit_dialog,
  386.                             "edit text",  args, n);
  387.     XtAddCallback (edit_text, XmNvalueChangedCallback,
  388.                        EditChangedCB, (caddr_t) day);
  389. #ifdef MOTIF_1_0
  390.     /* edit_text is a child of a form in a dialog.
  391.        A form is a subclass of a bulletin board which
  392.        "redefines" the return key in this context.
  393.        Fix the return key back to what it should be: */
  394.     transTable = XtParseTranslationTable(transLine);
  395.     XtOverrideTranslations(edit_text, transTable);
  396. #endif
  397.  
  398.     text[day] = ReadFile(day);
  399.     XmTextSetString (edit_text, text[day]);
  400.     XtManageChild (edit_text);
  401.     return (edit_text);
  402. }
  403. /*
  404. **    Read the contents of the file into
  405. **    a string and return the string.
  406. *    Returns NULL on any failure (eg no file)
  407. */
  408. char *
  409. ReadFile(day)
  410.     int day;
  411. {
  412.     char filename[4];
  413.     struct stat statbuf;  /* File Info. */
  414.     int file_length;      /* File Length */
  415.     char * file_string;   /* File Contents */
  416.     FILE *fp = NULL;      /* File Pointer */
  417.     int nread;    sprintf (filename, "%d", day);
  418.     if ((fp = fopen(filename, "r+")) == NULL)
  419.         if ((fp = fopen(filename, "r")) != NULL)
  420.         {
  421.                 fprintf(stderr,
  422.                    "Warning: file opened read only.\n");
  423.         }
  424.         else
  425.         {
  426.                 return((char *) NULL);
  427.         }    if (stat(filename, &statbuf) == 0)
  428.          file_length = statbuf.st_size;
  429.     else
  430.          file_length = 1000; /* arbitrary file length */      /* read the file string */
  431.     file_string = (char *)
  432.                   XtMalloc((unsigned)file_length + 1);
  433.     nread = fread(file_string, sizeof(char),
  434.                   file_length, fp);
  435.     /* NULL terminate the string */
  436.     file_string[nread] = (char) 0;
  437.     /* close the file */
  438.     if (fclose(fp) != NULL)
  439.         fprintf(stderr,
  440.                 "Warning: unable to close file.\n");
  441.     return (file_string);
  442. }
  443. /*----------------------------------------------------
  444. ** Callbacks for each of the three help buttons
  445. */
  446.  
  447. /*----------------------------------------------------
  448. **    ApplicHelpCB  - callback for help button
  449. */
  450. void 
  451. ApplicHelpCB (w, client_data, call_data)
  452.     Widget    w;   
  453.     caddr_t    client_data;
  454.     caddr_t    call_data;    
  455. {
  456.     Widget        message_box;
  457.  
  458.     /*    Create help window.
  459.     */
  460.     message_box = CreateHelp (w, APPLIC_HELP_TEXT,
  461.                               "Application");
  462.     /*    Display help window.
  463.     */
  464.     XtManageChild (message_box);
  465. }
  466.  
  467. /*-------------------------------------------------
  468. **    AboutHelpCB            - callback for help button
  469. */
  470. void 
  471. AboutHelpCB (w, client_data, call_data)
  472.     Widget    w;    
  473.     caddr_t    client_data; 
  474.     caddr_t    call_data;  
  475. {
  476.     Widget        message_box;
  477.  
  478.     /*    Create help window.
  479.     */
  480.     message_box = CreateHelp (w, ABOUT_HELP_TEXT,
  481.                               "About");
  482.     /*    Display help window.
  483.     */
  484.     XtManageChild (message_box);
  485. }
  486.  
  487. /*-----------------------------------------------------
  488. **    EditHelpCB            - callback for help button
  489. */
  490. void
  491. EditHelpCB (w, day, call_data)
  492.     Widget    w;     
  493.     caddr_t    day;
  494.     caddr_t    call_data; 
  495. {
  496.     Widget        message_box;   
  497.  
  498.     /*    Create help window.
  499.     */
  500.     message_box = CreateHelp (w, EDIT_HELP_TEXT,
  501.                       "Edit"); 
  502.    /*    Display help window.
  503.     */
  504.     XtManageChild (message_box);
  505. }
  506.  
  507. void
  508. SaveFile (day)
  509.     int day;
  510. {   char filename[4];
  511.     FILE *fp = NULL;
  512.  
  513.     /* free the old string and get the current text
  514.     */
  515.     XtFree (text[day]);
  516.     text[day] = XmTextGetString (popups[day]);
  517.     sprintf (filename, "%d", day);
  518.     if ((fp = fopen (filename, "w")) == NULL)
  519.     {    fprintf (stderr,
  520.             "Can't open file %s for writing\n",
  521.             filename);
  522.         return;
  523.     }
  524.     fputs (text[day], fp);
  525.     if (fclose (fp) != NULL)
  526.         fprintf (stderr,
  527.             "Can't close file %s\n", filename);
  528.     else
  529.         text_saved[day] = True;
  530. }
  531.  
  532. void
  533. EditSaveCB(w, client_data, call_data)
  534.     Widget w;
  535.     caddr_t client_data;
  536.     caddr_t call_data;
  537. {   int day;    day = (int) client_data;
  538.     SaveFile (day);
  539. }
  540.  
  541. void
  542. EditCancelCB(w, client_data, call_data)
  543.     Widget w;
  544.     caddr_t client_data;
  545.     caddr_t call_data;
  546. {   int day;
  547.  
  548.     /* extract the day value, casting it
  549.        back to int from pointer
  550.     */
  551.     day = (int) client_data;
  552.  
  553.     /* restore text to last saved value
  554.     */
  555.     XmTextSetString (popups[day], text[day]);
  556.     text_saved[day] = True;
  557. }
  558.  
  559.  
  560. void
  561. EditExitCB(w, day, call_data)
  562.     Widget w;
  563.     caddr_t day;
  564.     caddr_t call_data;
  565. {
  566.     XtUnmanageChild(w);
  567. }
  568.  
  569. void
  570. EditChangedCB(w, client_data, call_data)
  571.     Widget w;
  572.     caddr_t client_data;
  573.     caddr_t call_data;
  574. {   int day = (int) client_data;
  575.     text_saved[day] = False;
  576. }
  577.  
  578. /*
  579. **    Edit Day CB
  580. */
  581. void 
  582. EditDayCB  (w, editor, call_data)
  583.     Widget    w;        /*  widget id        */
  584.     Widget    editor;
  585.     caddr_t    call_data;    /*  data from widget class  */
  586. {
  587.     /* parent is the scroll bar, its parent the
  588.        unmanaged selection box
  589.     */
  590.     XtManageChild (XtParent(XtParent(editor)));
  591. }
  592.  
  593. /*-----------------------------------------------
  594. **    FileSaveCB            - callback for quit button
  595. */
  596. void 
  597. FileSaveCB (w, client_data, call_data)
  598.     Widget    w;
  599.     caddr_t    client_data; 
  600.     caddr_t    call_data;   
  601. {   int day;
  602.  
  603.     for (day = 1; day <= 28; day++)
  604.         if ( ! text_saved[day])
  605.             SaveFile (day);
  606. }
  607.  
  608. void
  609. modal_dialog_loop (w, dialog_over)
  610.     Widget w;
  611.     Bool *dialog_over;
  612. {   int n = 0;
  613.  
  614.     XtSetArg (args[n], XmNdialogStyle,
  615.               XmDIALOG_FULL_APPLICATION_MODAL); n++;
  616.     XtSetValues (w, args, n);
  617.     XtManageChild (w);
  618.     while (*dialog_over == False)
  619.         XtProcessEvent (XtIMAll);
  620.     XtUnmanageChild (w);
  621.     XtDestroyWidget (XtParent (w));
  622. }
  623.  
  624. void
  625. ExitSaveCB(w, dialog_over, call_data)
  626.     Widget w;
  627.     Bool *dialog_over;
  628.     caddr_t call_data;
  629. {   int day;
  630.     caddr_t data;
  631.     int n = 0;
  632.  
  633.     /* find which day it is */
  634.     XtSetArg (args[n], XmNuserData, &data); n++;
  635.     XtGetValues (w, args, n);
  636.     /* convert back from pointer type */
  637.     day = (int) data;
  638.  
  639.     SaveFile (day);
  640.     *dialog_over = True;
  641. }
  642.  
  643. void
  644. ExitDontSaveCB(w, dialog_over, call_data)
  645.     Widget w;
  646.     Bool *dialog_over;
  647.     caddr_t call_data;
  648. {
  649.     *dialog_over = True;
  650. }
  651.  
  652. void 
  653. ExitAnywayCB (w, client_data, call_data)
  654.     Widget    w;
  655.     caddr_t    client_data;
  656.     caddr_t    call_data;
  657. {
  658.     exit(0);
  659. }
  660.  
  661. void 
  662. DayUnsaved (day)
  663.     int day;
  664. {   Widget warn = NULL;
  665.     char message[512];
  666.     XmString xmmessage;
  667.     int n;
  668.     Bool dialog_over = False;
  669.  
  670.     n = 0;
  671.     warn = XmCreateWarningDialog (popups[day],
  672.                      "warning", args, n);
  673.     XtAddCallback (warn, XmNokCallback,
  674.                          ExitSaveCB, &dialog_over);
  675.     XtAddCallback (warn, XmNcancelCallback,
  676.                          ExitDontSaveCB, &dialog_over);
  677.     XtAddCallback (warn, XmNhelpCallback,
  678.                          ExitAnywayCB, NULL);
  679.     sprintf (message, "Day %d\nnot saved", day);
  680.     xmmessage = XmStringCreateLtoR (message,
  681.                          XmSTRING_DEFAULT_CHARSET);
  682.     n = 0;
  683.     XtSetArg (args[n], XmNmessageString,
  684.                        xmmessage); n++;
  685.     /* store the day value in the widget's user data */
  686.     XtSetArg (args[n], XmNuserData, (caddr_t) day); n++;
  687.     XtSetValues (warn, args, n);
  688.     XtManageChild (warn);
  689.     XmStringFree (xmmessage);
  690.  
  691.     /* make the dialog modal */
  692.     modal_dialog_loop (warn, &dialog_over);
  693. }
  694.  
  695. /*---------------------------------------------------
  696. **    FileExitCB            - callback for quit button
  697. */
  698. void
  699. FileExitCB (w, client_data, call_data)
  700.     Widget    w;  
  701.     caddr_t    client_data;  
  702.     caddr_t    call_data;   
  703. {   int day;
  704.  
  705.     /* modal dialogs to query about unsaved days */
  706.     for (day = 1; day <= 28; day++)
  707.         if ( !text_saved[day])
  708.              DayUnsaved(day);
  709.     exit (0);
  710. }
  711.